﻿using System;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using System.Data.Common;
using System.Data;
using System.Collections.Generic;

namespace Sinacor.Servico.Bovespa.Contabil.ResourceAccess
{
    /// <summary>
    /// ResourceAccess Class - ContaContabilFaturamento
    /// </summary>
    public class ContaContabilFaturamento : BaseResourceAccess
    {
        #region Construtor

        /// <summary>
        /// Construtor
        /// </summary>
        public ContaContabilFaturamento() : base(AuthorizationContext.Current.CompanyId) { }

        #endregion

        #region Métodos Privados

        #region CondicaoSql

        /// <summary>
        /// Método utilizado nas montagens de filtros opcionais
        /// </summary>
        /// <param name="possuiFiltro">Boolean</param>
        /// <returns>String</returns>
        private String CondicaoSql(Boolean possuiFiltro)
        {
            if (possuiFiltro)
                return " AND ";
            else
                return " WHERE ";
        }

        #endregion

        #endregion

        #region Métodos Públicos

        #region AlterarContaContabilFaturamento

        /// <summary>
        /// Serviço irá alterar o ContaContabilFaturamento informado como parâmetro
        /// </summary>
        /// <param name="request">BusinessEntity.ContaContabilFaturamento</param>
        public void AlterarContaContabilFaturamento(BusinessEntity.ContaContabilFaturamento entity)
        {
            String sql = @"UPDATE TBOCTACON
                             SET CD_CTADEB    = :ContaDebito, 	
                                 CD_CTACRE    = :ContaCredito, 	
                                 CD_CTARESDEB = :CodigoResumidoDebito, 
                                 DV_CTARESDEB = :DigitoResumidoDebito, 
                                 CD_CTARESCRE = :CodigoResumidoCredito, 
                                 DV_CTARESCRE = :DigitoResumidoCredito, 
                                 CD_HISDEB    = :CodigoHistoricoDebito, 
                                 DV_HISDEB    = :DigitoHistoricoDebito, 
                                 CD_HISCRE    = :CodigoHistoricoCredito, 
                                 DV_HISCRE    = :DigitoHistoricoCredito, 
                                 CD_HISEST    = :CodigoHistoricoEstorno, 
                                 DV_HISEST    = :DigitoHistoricoEstorno
                           WHERE CD_BOLSA     = :CodigoBolsa
                             AND CD_GRUP_CONT = :CodigoGrupoContabil
                             AND CD_EVECON    = :CodigoEventoContabil
                             AND CD_MUNICIPIO = :CodigoMunicipio";

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                this.DataBase.AddInParameter(dbCommand, "ContaDebito", DbType.String, entity.ContaDebito);
                this.DataBase.AddInParameter(dbCommand, "ContaCredito", DbType.String, entity.ContaCredito);
                this.DataBase.AddInParameter(dbCommand, "CodigoResumidoDebito", DbType.Int32, entity.CodigoResumidoDebito);
                this.DataBase.AddInParameter(dbCommand, "DigitoResumidoDebito", DbType.Byte, entity.DigitoResumidoDebito);
                this.DataBase.AddInParameter(dbCommand, "CodigoResumidoCredito", DbType.Int32, entity.CodigoResumidoCredito);
                this.DataBase.AddInParameter(dbCommand, "DigitoResumidoCredito", DbType.Byte, entity.DigitoResumidoCredito);
                this.DataBase.AddInParameter(dbCommand, "CodigoHistoricoDebito", DbType.Int32, entity.CodigoHistoricoDebito);
                this.DataBase.AddInParameter(dbCommand, "DigitoHistoricoDebito", DbType.Byte, entity.DigitoHistoricoDebito);
                this.DataBase.AddInParameter(dbCommand, "CodigoHistoricoCredito", DbType.Int32, entity.CodigoHistoricoCredito);
                this.DataBase.AddInParameter(dbCommand, "DigitoHistoricoCredito", DbType.Byte, entity.DigitoHistoricoCredito);
                this.DataBase.AddInParameter(dbCommand, "CodigoHistoricoEstorno", DbType.Int32, entity.CodigoHistoricoEstorno);
                this.DataBase.AddInParameter(dbCommand, "DigitoHistoricoEstorno", DbType.Byte, entity.DigitoHistoricoEstorno);
                this.DataBase.AddInParameter(dbCommand, "CodigoBolsa", DbType.String, entity.CodigoBolsa);
                this.DataBase.AddInParameter(dbCommand, "CodigoGrupoContabil", DbType.Int32, entity.CodigoGrupoContabil);
                this.DataBase.AddInParameter(dbCommand, "CodigoEventoContabil", DbType.Int32, entity.CodigoEventoContabil);
                this.DataBase.AddInParameter(dbCommand, "CodigoMunicipio", DbType.Int32, entity.CodigoMunicipio);

                this.DataBase.ExecuteNonQuery(dbCommand);
            }
        }

        #endregion

        #region ConsultarContasContabeisFaturamento

        /// <summary>
        /// Serviço irá Consultar uma lista de ContasContabeisFaturamento, utilizando o parâmetro informado
        /// </summary>
        /// <param name="parameter">BusinessEntity.Parameter.FiltroContaContabilFaturamento</param>
        /// <returns>Lista de objetos do tipo BusinessEntity.ContaContabilFaturamento</returns>
        public List<BusinessEntity.ContaContabilFaturamento> ConsultarContasContabeisFaturamento(BusinessEntity.Parameter.FiltroContaContabilFaturamento parameter)
        {
            List<BusinessEntity.ContaContabilFaturamento> response = new List<BusinessEntity.ContaContabilFaturamento>();

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(" "))
            {
                String condicao = String.Empty;
                Boolean possuiFiltro = false;

                if (!String.IsNullOrEmpty(parameter.CodigoBolsa))
                {
                    this.DataBase.AddInParameter(dbCommand, "CodigoBolsa", DbType.String, parameter.CodigoBolsa);
                    condicao = " WHERE A.CD_BOLSA = :CodigoBolsa ";
                    possuiFiltro = true;
                }

                if (parameter.CodigoGrupoContabil.HasValue)
                {
                    this.DataBase.AddInParameter(dbCommand, "CodigoGrupoContabil", DbType.Int32, parameter.CodigoGrupoContabil.Value);
                    condicao += this.CondicaoSql(possuiFiltro) + " A.CD_GRUP_CONT = :CodigoGrupoContabil ";
                    possuiFiltro = true;
                }

                if (parameter.CodigoEventoContabil.HasValue)
                {
                    this.DataBase.AddInParameter(dbCommand, "CodigoEventoContabil", DbType.Int32, parameter.CodigoEventoContabil.Value);
                    condicao += this.CondicaoSql(possuiFiltro) + " A.CD_EVECON = :CodigoEventoContabil ";
                    possuiFiltro = true;
                }

                if (parameter.CodigoMunicipio.HasValue)
                {
                    this.DataBase.AddInParameter(dbCommand, "CodigoMunicipio", DbType.Int32, parameter.CodigoMunicipio.Value);
                    condicao += this.CondicaoSql(possuiFiltro) + " A.CD_MUNICIPIO = :CodigoMunicipio ";
                }

                String sql = String.Format(@"SELECT A.CD_BOLSA CodigoBolsa,
                                                    B.NM_RESU_BOLSA DescricaoBolsa,
                                                    A.CD_GRUP_CONT CodigoGrupoContabil,
                                                    C.DS_GRUP_CONT DescricaoGrupoContabil,
                                                    A.CD_EVECON CodigoEventoContabil,
                                                    D.DS_EVECON DescricaoEventoContabil,
                                                    A.CD_MUNICIPIO CodigoMunicipio,
                                                    E.NM_MUNICIPIO DescricaoMunicipio,
                                                    A.CD_CTARESCRE CodigoResumidoCredito,
                                                    A.DV_CTARESCRE DigitoResumidoCredito,
                                                    A.CD_CTACRE ContaCredito,
                                                    A.CD_HISCRE CodigoHistoricoCredito,
                                                    A.DV_HISCRE DigitoHistoricoCredito,
                                                    A.CD_CTARESDEB CodigoResumidoDebito,
                                                    A.DV_CTARESDEB DigitoResumidoDebito,
                                                    A.CD_CTADEB ContaDebito,
                                                    A.CD_HISDEB CodigoHistoricoDebito,
                                                    A.DV_HISDEB DigitoHistoricoDebito,
                                                    A.CD_HISEST CodigoHistoricoEstorno,
                                                    A.DV_HISEST DigitoHistoricoEstorno
                                               FROM TBOCTACON A
                                         INNER JOIN TGEBOLSA B ON B.CD_BOLSA = A.CD_BOLSA
                                         INNER JOIN TSCGRUCON C ON C.CD_GRUP_CONT = A.CD_GRUP_CONT
                                         INNER JOIN TBOEVECON D ON D.CD_EVECON = A.CD_EVECON
                                         INNER JOIN TSCMUNICIPIO E ON E.CD_MUNICIPIO = A.CD_MUNICIPIO
                                                 {0}
                                           ORDER BY A.CD_GRUP_CONT, A.CD_EVECON", condicao);

                dbCommand.CommandText = sql;

                response = this.FindAll<BusinessEntity.ContaContabilFaturamento>(dbCommand,
                    reader =>
                    {
                        BusinessEntity.ContaContabilFaturamento entity = new BusinessEntity.ContaContabilFaturamento();

                        entity.CodigoBolsa = reader.GetValue<String>("CodigoBolsa");
                        entity.CodigoEventoContabil = reader.GetValue<Int32>("CodigoEventoContabil");
                        entity.CodigoGrupoContabil = reader.GetValue<Int32>("CodigoGrupoContabil");
                        entity.CodigoHistoricoCredito = reader.GetValue<Int32?>("CodigoHistoricoCredito");
                        entity.CodigoHistoricoDebito = reader.GetValue<Int32?>("CodigoHistoricoDebito");
                        entity.CodigoHistoricoEstorno = reader.GetValue<Int32?>("CodigoHistoricoEstorno");
                        entity.CodigoMunicipio = reader.GetValue<Int32>("CodigoMunicipio");
                        entity.CodigoResumidoCredito = reader.GetValue<Int32?>("CodigoResumidoCredito");
                        entity.CodigoResumidoDebito = reader.GetValue<Int32?>("CodigoResumidoDebito");
                        entity.ContaCredito = reader.GetValue<String>("ContaCredito");
                        entity.ContaDebito = reader.GetValue<String>("ContaDebito");
                        entity.DescricaoBolsa = reader.GetValue<String>("DescricaoBolsa");
                        entity.DescricaoEventoContabil = reader.GetValue<String>("DescricaoEventoContabil");
                        entity.DescricaoGrupoContabil = reader.GetValue<String>("DescricaoGrupoContabil");
                        entity.DescricaoMunicipio = reader.GetValue<String>("DescricaoMunicipio");
                        entity.DigitoHistoricoCredito = reader.GetValue<Byte?>("DigitoHistoricoCredito");
                        entity.DigitoHistoricoDebito = reader.GetValue<Byte?>("DigitoHistoricoDebito");
                        entity.DigitoHistoricoEstorno = reader.GetValue<Byte?>("DigitoHistoricoEstorno");
                        entity.DigitoResumidoCredito = reader.GetValue<Byte?>("DigitoResumidoCredito");
                        entity.DigitoResumidoDebito = reader.GetValue<Byte?>("DigitoResumidoDebito");

                        return entity;
                    });

                return response;
            }
        }

        #endregion

        #region ExcluirContaContabilFaturamento

        /// <summary>
        /// Serviço irá excluir o ContaContabilFaturamento informado como parâmetro
        /// </summary>
        /// <param name="parameter">BusinessEntity.Parameter.FiltroContaContabilFaturamentoChave</param>
        public void ExcluirContaContabilFaturamento(BusinessEntity.Parameter.FiltroContaContabilFaturamentoChave parameter)
        {
            String sql = @"DELETE FROM TBOCTACON
                            WHERE CD_BOLSA     = :CodigoBolsa
                              AND CD_GRUP_CONT = :CodigoGrupoContabil
                              AND CD_EVECON    = :CodigoEventoContabil
                              AND CD_MUNICIPIO = :CodigoMunicipio";

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                this.DataBase.AddInParameter(dbCommand, "CodigoBolsa", DbType.String, parameter.CodigoBolsa);
                this.DataBase.AddInParameter(dbCommand, "CodigoGrupoContabil", DbType.Int32, parameter.CodigoGrupoContabil);
                this.DataBase.AddInParameter(dbCommand, "CodigoEventoContabil", DbType.Int32, parameter.CodigoEventoContabil);
                this.DataBase.AddInParameter(dbCommand, "CodigoMunicipio", DbType.Int32, parameter.CodigoMunicipio);

                this.DataBase.ExecuteNonQuery(dbCommand);
            }
        }

        #endregion

        #region IncluirContaContabilFaturamento

        /// <summary>
        /// Serviço irá incluir o ContaContabilFaturamento informado como parâmetro
        /// </summary>
        /// <param name="entity">BusinessEntity.ContaContabilFaturamento</param>
        public void IncluirContaContabilFaturamento(BusinessEntity.ContaContabilFaturamento entity)
        {
            String sql = @"INSERT INTO TBOCTACON (CD_BOLSA,
                                                  CD_GRUP_CONT,
                                                  CD_EVECON,
                                                  CD_CTADEB,
                                                  CD_CTACRE,
                                                  CD_CTARESDEB,
                                                  DV_CTARESDEB, 
                                                  CD_CTARESCRE,
                                                  DV_CTARESCRE,
                                                  CD_HISDEB,
                                                  DV_HISDEB,
                                                  CD_HISCRE,
                                                  DV_HISCRE, 
                                                  CD_HISEST,
                                                  DV_HISEST,
                                                  CD_MUNICIPIO)
                                          VALUES (:CodigoBolsa,
                                                  :CodigoGrupoContabil,
                                                  :CodigoEventoContabil,
                                                  :ContaDebito,
                                                  :ContaCredito,
                                                  :CodigoResumidoDebito,
                                                  :DigitoResumidoDebito, 
                                                  :CodigoResumidoCredito,
                                                  :DigitoResumidoCredito,
                                                  :CodigoHistoricoDebito,
                                                  :DigitoHistoricoDebito,
                                                  :CodigoHistoricoCredito,
                                                  :DigitoHistoricoCredito, 
                                                  :CodigoHistoricoEstorno,
                                                  :DigitoHistoricoEstorno,
                                                  :CodigoMunicipio)";

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {                
                this.DataBase.AddInParameter(dbCommand, "CodigoBolsa", DbType.String, entity.CodigoBolsa);
                this.DataBase.AddInParameter(dbCommand, "CodigoGrupoContabil", DbType.Int32, entity.CodigoGrupoContabil);
                this.DataBase.AddInParameter(dbCommand, "CodigoEventoContabil", DbType.Int32, entity.CodigoEventoContabil);
                this.DataBase.AddInParameter(dbCommand, "ContaDebito", DbType.String, entity.ContaDebito);
                this.DataBase.AddInParameter(dbCommand, "ContaCredito", DbType.String, entity.ContaCredito);
                this.DataBase.AddInParameter(dbCommand, "CodigoResumidoDebito", DbType.Int32, entity.CodigoResumidoDebito);
                this.DataBase.AddInParameter(dbCommand, "DigitoResumidoDebito", DbType.Byte, entity.DigitoResumidoDebito);
                this.DataBase.AddInParameter(dbCommand, "CodigoResumidoCredito", DbType.Int32, entity.CodigoResumidoCredito);
                this.DataBase.AddInParameter(dbCommand, "DigitoResumidoCredito", DbType.Byte, entity.DigitoResumidoCredito);
                this.DataBase.AddInParameter(dbCommand, "CodigoHistoricoDebito", DbType.Int32, entity.CodigoHistoricoDebito);
                this.DataBase.AddInParameter(dbCommand, "DigitoHistoricoDebito", DbType.Byte, entity.DigitoHistoricoDebito);
                this.DataBase.AddInParameter(dbCommand, "CodigoHistoricoCredito", DbType.Int32, entity.CodigoHistoricoCredito);
                this.DataBase.AddInParameter(dbCommand, "DigitoHistoricoCredito", DbType.Byte, entity.DigitoHistoricoCredito);
                this.DataBase.AddInParameter(dbCommand, "CodigoHistoricoEstorno", DbType.Int32, entity.CodigoHistoricoEstorno);
                this.DataBase.AddInParameter(dbCommand, "DigitoHistoricoEstorno", DbType.Byte, entity.DigitoHistoricoEstorno);
                this.DataBase.AddInParameter(dbCommand, "CodigoMunicipio", DbType.Int32, entity.CodigoMunicipio);

                this.DataBase.ExecuteNonQuery(dbCommand);
            }
        }

        #endregion

        #endregion
    }
}
